import { ethers } from 'ethers';

class Web3Helper {
  constructor() {
    this.provider = null;
    this.signer = null;
    this.contract = null;
    this.account = null;
    
    // 初始化时自动检查是否已连接
    this.checkExistingConnection();
  }

  // 检查是否已存在连接（用户之前已授权）
  async checkExistingConnection() {
    if (!this.isMetaMaskInstalled()) return;
    
    try {
      // eth_accounts 不会弹出授权窗口，只检查是否已授权
      const accounts = await window.ethereum.request({
        method: 'eth_accounts'
      });
      
      if (accounts && accounts.length > 0) {
        // 已有授权，自动恢复连接
        this.account = accounts[0];
        this.provider = new ethers.providers.Web3Provider(window.ethereum);
        this.signer = this.provider.getSigner();
        
        // 保存到 localStorage，便于刷新后快速恢复
        localStorage.setItem('walletAddress', this.account);
        
        console.log('✅ 自动恢复钱包连接:', this.account);
      } else {
        // 没有授权账户，清除 localStorage
        localStorage.removeItem('walletAddress');
      }
    } catch (error) {
      console.error('检查钱包连接失败:', error);
    }
  }

  // 检查 MetaMask 是否安装
  isMetaMaskInstalled() {
    return typeof window.ethereum !== 'undefined';
  }

  // 连接 MetaMask
  async connect() {
    if (!this.isMetaMaskInstalled()) {
      throw new Error('请安装 MetaMask 钱包');
    }

    try {
      // 请求账户访问
      const accounts = await window.ethereum.request({
        method: 'eth_requestAccounts'
      });

      this.account = accounts[0];
      this.provider = new ethers.providers.Web3Provider(window.ethereum);
      this.signer = this.provider.getSigner();
      
      // 保存到 localStorage
      localStorage.setItem('walletAddress', this.account);

      // 监听账户变化
      window.ethereum.on('accountsChanged', (accounts) => {
        if (accounts.length === 0) {
          this.disconnect();
        } else {
          this.account = accounts[0];
          window.location.reload();
        }
      });

      // 监听网络变化
      window.ethereum.on('chainChanged', () => {
        window.location.reload();
      });

      return this.account;
    } catch (error) {
      console.error('连接 MetaMask 失败:', error);
      throw error;
    }
  }

  // 断开连接
  disconnect() {
    this.provider = null;
    this.signer = null;
    this.contract = null;
    this.account = null;
    
    // 清除 localStorage
    localStorage.removeItem('walletAddress');
  }

  // 获取当前账户
  getAccount() {
    return this.account;
  }

  // 获取余额
  async getBalance(address) {
    if (!this.provider) {
      throw new Error('请先连接钱包');
    }
    const balance = await this.provider.getBalance(address || this.account);
    return ethers.utils.formatEther(balance);
  }

  // 初始化合约
  // readOnly: 为 true 时只读模式，不需要钱包；为 false 时需要钱包签名
  initContract(contractAddress, contractABI, readOnly = false) {
    if (readOnly) {
      // 只读模式：使用 provider，不需要连接钱包
      this.contract = new ethers.Contract(contractAddress, contractABI, this.provider);
    } else {
      // 写入模式：使用 signer，需要连接钱包
      if (!this.signer) {
        throw new Error('请先连接钱包');
      }
      this.contract = new ethers.Contract(contractAddress, contractABI, this.signer);
    }
    return this.contract;
  }

  // 获取合约实例
  getContract() {
    return this.contract;
  }

  // 获取网络信息
  async getNetwork() {
    if (!this.provider) {
      throw new Error('请先连接钱包');
    }
    return await this.provider.getNetwork();
  }

  // 切换网络
  async switchNetwork(chainId) {
    try {
      await window.ethereum.request({
        method: 'wallet_switchEthereumChain',
        params: [{ chainId: `0x${chainId.toString(16)}` }]
      });
    } catch (error) {
      // 如果网络不存在，尝试添加
      if (error.code === 4902) {
        throw new Error('请手动添加该网络');
      }
      throw error;
    }
  }

  // 格式化以太币
  formatEther(value) {
    return ethers.utils.formatEther(value);
  }

  // 解析以太币
  parseEther(value) {
    return ethers.utils.parseEther(value.toString());
  }
}

export default new Web3Helper();

